Introducción a R

Crear código en R, uso colaborativo y reproducible

Bienvenidxs!!

¿Quiénes somos?

Organización del curso

Por día

Lunes = introducción a R, crear código, buenas prácticas
Martes = manejo y visualizacion de datos
Miércoles = modelos lineales y factoriales
Jueves = modelos generalizados y multivariantes
Viernes = uso colaborativo, dudas, ejemplos

Por hora

  • 9:30 a 10:30 teoría
  • 10:30 a 11:15 ejercicios
  • 11:15 a 11:30 break
  • 11 a 12:30 teoría
  • 12 a 13:30 ejercicios y dudas

Hoy

  • Introducción, código básico
  • Ejercicios I
  • Funciones, bucles, dataframes
  • Ejercicios II y III

Lo que vas a aprender:

  • Mejorar la comprensión y la práctica estadística.

  • Desarrollar habilidades en programación en R.

  • Aprender flujos de trabajo eficientes, limpios y reproducibles.

  • Saber buscar información

  • No enredarse en errores

Lo que no vas a aprender:

  • A programar en plan pro sin mirar internet o chatgpt

  • A hacer páginas web

  • A dejar de pelearte con la estadística

Llenos y vacíos de conocimiento

WordCloud de la encuesta de este curso

Introducción

R es un lenguaje y entorno de programación especializado en:

  • Análisis estadístico, visualización de datos y ciencia de datos.
  • Es utilizado por investigadores, analistas y científicos para explorar, modelar y comunicar información basada en datos de forma eficiente y reproducible.
  • Muy utilizado en biología

Biólogxs en general

R y Rtudio

R → Es el lenguaje de programación y el motor que realiza los cálculos estadísticos y el análisis de datos.

RStudio → Es un entorno de desarrollo integrado (un “programa”) que facilita el uso de R con una interfaz amigable, con paneles, autocompletado y herramientas visuales.

Ejemplo mesa de trabajo en R studio

¿Qué puede hacer R?

  • Calcular y analizar (operaciones matemáticas, modelos, simulaciones, tests)
  • Trabajar con datos (leer y escribir tablas, limpiar datos, transformar datos)
  • Visualizar (graficos estadísticos, interactivos, mapas, animaciones, etc)
  • Automatizar y extender (crear funciones propias, desarrollar paquetes, reproducir analisis facilmente)
  • Comunicar (crear informes Quarto o RMarkdown, crear webs o apps Shiny)

Ejemplo quarto

Lo básico, básico de R

Operaciones con números

📠 Se hacen operaciones aritméticas (como una calculadora): multiplicar, dividir, sumar, restar…
Utilizamos la almohadilla # para silenciar o para comentar

2 + 3 # suma
[1] 5
10 - 4 # resta
[1] 6
3 * 5 # multiplicación
[1] 15
20 / 4 # división
[1] 5
4 %% 2 # módulo (resto de una división)
[1] 0

Operaciones básicas de lógica

Las operaciones lógicas comparan valores y devuelven un resultado lógico.
TRUE o FALSE

20 / 4 >= 10    # ¿5 es mayor o igual que 10? 
[1] FALSE
20 / 4 == 10    # ¿5 es igual a 10?
[1] FALSE
20 / 4 < 10     # ¿5 es menor que 10? 
[1] TRUE

TRUE se comporta como 1 y FALSE como 0.
Se pueden usar en cálculos.

valores <- c (TRUE, FALSE, TRUE, TRUE)
sum(valores)       # cuenta cuántos TRUE hay
[1] 3
mean(valores)      # proporción de TRUE
[1] 0.75

Acumular información

La magia de los objetos

x <- 10    
y <- 5
suma <- x + y
suma
[1] 15
suma + 7
[1] 22

Espera, pero ¿qué son los objetos?

  • Son un poco “cualquier cosa”
  • Siempre empiezan por una letra y son sensibles a mayusculas
  • Deberían llevar nombres coherentes y un orden
yo_uso_la_serpiente <- 10
OtraGenteUsaElCamello <- 9
otra.gente.usa.los.puntos <- 9
Hayque_evitar.esto10 <- 2

Tipos de objetos

Hay muchos tipos de objetos, se asignan con “<-”

  • numéricos, strings, matrices, tablas, listas…
  • modelos, polígonos, funciones, mapas…
numero <- 1:10
numero
 [1]  1  2  3  4  5  6  7  8  9 10
caracter <- "del uno al diez"
caracter
[1] "del uno al diez"
una_lista <- list(0:10, 10:20, 20:30)
una_lista
[[1]]
 [1]  0  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1] 10 11 12 13 14 15 16 17 18 19 20

[[3]]
 [1] 20 21 22 23 24 25 26 27 28 29 30

Podemos transformar objetos de un tipo a otro

Cambiar de un tipo a otro con as.factor(), as.numeric(), as.character()

numeros_como_caracteres <- as.character(numero)
numeros_como_caracteres
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
numeros <- as.numeric(numeros_como_caracteres)
numeros
 [1]  1  2  3  4  5  6  7  8  9 10

Ya iremos viendo más ejemplos…

Vectores

Vectores: elementos del mismo tipo juntos (numérico, carácter, etc.)

  • Muchos números juntos
  • Muchos nombres de especies juntas

(como una columna de una tabla…)

# un vector de cinco números 
numeros <- c(1, 2, 3, 4, 6) 
numeros
[1] 1 2 3 4 6
# un vector del 1 al 40
otros_numeros <- 1:40
otros_numeros
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Operaciones con vectores

# sumamos un mismo valor a cada uno de los elementos del vector
otros_numeros + 10
 [1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
[26] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Ejercicio vectores

Genera de dos maneras distintas un vector de números que vayan del 1 al 10

Resolvemos

Genera de dos maneras distintas un vector de números que vayan del 1 al 10

# Consecutivos 
1:10
 [1]  1  2  3  4  5  6  7  8  9 10
# Combinando 
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
 [1]  1  2  3  4  5  6  7  8  9 10
# Generador de secuencias: del 0 al 10 cada 1 
seq(1, 10, 1)
 [1]  1  2  3  4  5  6  7  8  9 10

Operaciones con vectores

Se pueden hacer medias, multiplicaciones de objetos, seleccionar parte de un vector, etc

promedio <- mean(numeros)
promedio
[1] 3.2
promedio * numeros
[1]  3.2  6.4  9.6 12.8 19.2
numeros / otros_numeros
 [1] 1.00000000 1.00000000 1.00000000 1.00000000 1.20000000 0.16666667
 [7] 0.28571429 0.37500000 0.44444444 0.60000000 0.09090909 0.16666667
[13] 0.23076923 0.28571429 0.40000000 0.06250000 0.11764706 0.16666667
[19] 0.21052632 0.30000000 0.04761905 0.09090909 0.13043478 0.16666667
[25] 0.24000000 0.03846154 0.07407407 0.10714286 0.13793103 0.20000000
[31] 0.03225806 0.06250000 0.09090909 0.11764706 0.17142857 0.02777778
[37] 0.05405405 0.07894737 0.10256410 0.15000000
# [ ] para seleccionar partes de un vector
(numeros / otros_numeros)[7]
[1] 0.2857143

Funciones básicas y útiles

Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.

Hay funciones ya de base de R (baseR) o en los paquetes ya creados por los usuarios (dplyr)

Funciones básicas y útiles

Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.

R base

# c () combinar
x <- c(4, 6, 8, 3, 9, 12, 12)

# Estadísticos básicos
mean(x)       # media
[1] 7.714286
median(x)     # mediana
[1] 8
sd(x)         # desviación estándar
[1] 3.59232
min(x)        # valor mínimo
[1] 3
max(x)        # valor máximo
[1] 12
range(x)      # rango (min, max)
[1]  3 12
summary(x)    # resumen general
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.000   5.000   8.000   7.714  10.500  12.000 

Ayuda

Ayuda para funciones en R (o también vale buscar en google “function mean in R”)

# Ayudas
?mean           # abre la ayuda de una función
help(mean)      # lo mismo que '?mean'
??"dplyr"      # búsqueda más amplia en toda la documentación

Gato de Shrek

Más funciones básicas y útiles

Aleatoriedad, ordenar, contar…

x <- rpois(8, 8)
sample(x, 3)          # elegir 3 elementos al azar
[1] 7 7 6
rev(x)                # invertir el orden
[1]  4  8 16  6  7 12  7  9
sort(x)               # ordenar valores
[1]  4  6  7  7  8  9 12 16
length(x)             # longitud del vector
[1] 8

Conteos y valores únicos

table(x)              # tabla de frecuencias
x
 4  6  7  8  9 12 16 
 1  1  2  1  1  1  1 
unique(x)             # valores únicos
[1]  9  7 12  6 16  8  4
length(unique(x))     # cuántos valores distintos
[1] 7

Más funciones básicas y útiles

Raiz cuadrada, logaritmo, etc

log(x)       # logaritmo natural
[1] 2.197225 1.945910 2.484907 1.945910 1.791759 2.772589 2.079442 1.386294
sqrt(x)      # raíz cuadrada
[1] 3.000000 2.645751 3.464102 2.645751 2.449490 4.000000 2.828427 2.000000
log10(x)     # logaritmo en base 10
[1] 0.9542425 0.8450980 1.0791812 0.8450980 0.7781513 1.2041200 0.9030900
[8] 0.6020600
x ^ 4        # Potencias
[1]  6561  2401 20736  2401  1296 65536  4096   256
abs(-0.23)   # Valores absolutos
[1] 0.23
round(0.1245, 2)     # redondear a 2 decimales
[1] 0.12

Generadores de distribuciones

R es muy potente generando distribuciones con funciones ya integradas.

  • runif () - uniforme
  • rnorm () - normal
  • rpois () - poisson

Una distribución describe cómo se reparten los valores de una variable, cómo de frecuentes son.

Distribución uniforme

Números al azar → todos con la misma probabilidad

# Un vector de 5 números aleatorios con distribución uniforme
runif(5)
[1] 0.002999131 0.331399263 0.889799141 0.713188847 0.746172514
# 100 valores del 0 al 100
x <- runif(1000, min = 0, max = 100)
hist(x, col = "orange")

Distribución normal

Peso de personas → muchas alrededor del promedio (forma de campana)

# 4 números con una distribución normal
rnorm(4)
[1]  0.72303459 -0.04640831  0.67434703 -1.73390731
# Especificando la media y la desviación
x <- rnorm(1000, mean = 50, sd = 10)
hist(x, col = "skyblue")

Distribución poisson

Datos de conteo → número de especies

# Generar 5 observaciones con media (λ) = 3
rpois(5, lambda = 3)
[1] 1 4 3 3 1
x <- rpois(1000, lambda = 3)
hist(x, col = "lightgreen")

Distribución binomial negativa

Resultados de “éxito o fracaso” (como lanzar una moneda)

# Binomial
# 20 experimentos, en cada uno lanzamos una monedas, con una probabilidad de que salga cara del 50%
caras <- rbinom(200, size = 1, prob = 0.5)
table(caras)
caras
  0   1 
 89 111 
barplot(table(caras), col = "steelblue")

Caracteres y strings

R trabaja muy bien con cadenas de texto (strings)

un_nombre <- "Laura" # caracter
nombres <- c("Laura", "Rocio", "Violeta", "Rocio", "Rocio") # string
unique (nombres)
[1] "Laura"   "Rocio"   "Violeta"
table (nombres)
nombres
  Laura   Rocio Violeta 
      1       3       1 
rep (nombres, 5)    # repetir algo varias veces
 [1] "Laura"   "Rocio"   "Violeta" "Rocio"   "Rocio"   "Laura"   "Rocio"  
 [8] "Violeta" "Rocio"   "Rocio"   "Laura"   "Rocio"   "Violeta" "Rocio"  
[15] "Rocio"   "Laura"   "Rocio"   "Violeta" "Rocio"   "Rocio"   "Laura"  
[22] "Rocio"   "Violeta" "Rocio"   "Rocio"  
sample (nombres, 3, replace=TRUE) 
[1] "Rocio" "Rocio" "Rocio"

Caracteres y strings

Operaciones lógicas

#¿existe Laura? ¿Hay algo que sea igual a Laura?
nombres == "Laura" 
[1]  TRUE FALSE FALSE FALSE FALSE
# ¿Hay algo que sea desigual a Laura?
nombres != "Laura"
[1] FALSE  TRUE  TRUE  TRUE  TRUE
# ¿Está incluído dentro de un vector de dos nombres?
nombres == c("Laura", "Rocio") #nope
[1]  TRUE  TRUE FALSE  TRUE FALSE
nombres %in% c("Laura", "Rocio") #yes
[1]  TRUE  TRUE FALSE  TRUE  TRUE

Ejercicios

  1. Calcula el minimo valor de 100 valores aleatorios según una distribución normal

  2. Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.

  3. Ejercicio

  • Crea un vector con 20 números aleatorios entre 0 y 50.
  • Calcula el promedio y la desviación estándar.
  • Multiplica todos los valores por 2.
  • Dibuja un histograma.
  • ¿Cómo cambia el promedio después de multiplicar por 2?
  1. Crea un vector con edades y usa una comparación para saber cuáles son mayores de edad y cualcula cuantos no lo son

Resolvemos

  1. Calcula el minimo valor de 100 valores aleatorios según una distribución normal
min (rnorm (100))
[1] -2.965079
  1. Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.
pares <- seq (0, 20, 2)
  1. Ejercicio
mi_vector <- runif(20,0,50)
mean (mi_vector)
[1] 27.72433
sd (mi_vector)
[1] 14.92691
mi_vector_2 <- mi_vector*2
hist(mi_vector_2)
  1. Crea un vector con edades y usa una comparación para saber cuáles son mayores de edad y cualcula cuantos no lo son
edades <- c(12, 18, 3, 44, 25, 15, 30)
sum (edades > 18)
[1] 3

Funciones propias

Sirven para ejecutar una tarea compleja y personalizada

Ventajas:

  • Se puede reutilizar
  • Toma entradas (argumentos)
  • Devuelve salidas (resultados)
  • Sirve para organizar y simplificar el código

Ejemplo de funciones

Creamos nuestras propias funciones con function ()
Muchas ejecuciones (i.e. tareas) distintas para un mismo vector.

# Queremos la media de nuestros números  y la media de estos transformados a logaritmo

vector <- seq(1, 100, 10)
mean (log (vector))
[1] 3.380067
# Queremos la desviación estándar de nuestros números y de éstos transformados a log

vector2 <- seq(1, 300, 50)
mean (log (vector2))
[1] 4.065497
# Una función que hace todo eso a la vez y más cosas

log_vect <- function (y) {
  mean <- mean (y)
  mean_log <- mean (log (y+1))
  sd <- sd (y)
  sd_log <- sd (log (y+1))
  return(c(mean, mean_log, sd, sd_log))
}

vector3 <- sample (40)
log_vect (vector3)
[1] 20.5000000  2.8508553 11.6904519  0.7631147

Bucles

  • Distintos a las funciones
  • Un bucle (loop) sirve para repetir una acción varias veces.
  • A cada repetición se le llama iteración Se usa cuando quieres hacer lo mismo para muchos elementos (por ejemplo, recorrer filas, listas o vectores).
    A mano del 1 al 5 está bien… pero del 1 al 100?
for (i in 1:5) {
  print(paste("Aquí está el número", i))
}
[1] "Aquí está el número 1"
[1] "Aquí está el número 2"
[1] "Aquí está el número 3"
[1] "Aquí está el número 4"
[1] "Aquí está el número 5"
valores <- c(10, 20, 30, 40)

for (v in valores) {
  print(mean(log(v + 1)))
}
[1] 2.397895
[1] 3.044522
[1] 3.433987
[1] 3.713572

la iteración puede ser por string

nombres <- c ("Laura", "Rocio", "Violeta")

length(nombres) # número de iteraciones 
[1] 3
for (i in nombres) {
  print(paste("Aquí está la alumna", i))
}
[1] "Aquí está la alumna Laura"
[1] "Aquí está la alumna Rocio"
[1] "Aquí está la alumna Violeta"

Bucles II 🎲

Imaginemos que queremos tirar un dado

# un dado 🎲
sample(1:6, 1)
[1] 4

Queremos repetir la función anterior 100 veces (tirar el dado 100 veces)
🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲 x 100

# Hay que generar un objeto vacío

tiro <- c()

for (i in 1:100) {
  tiro[[i]] <- sample(1:6, 1)
}

unlist(tiro)
  [1] 5 1 2 5 5 6 2 1 6 2 1 1 5 6 6 5 5 6 2 6 5 1 5 5 4 2 1 4 6 3 4 6 5 1 5 3 1
 [38] 3 4 3 2 5 3 1 5 1 3 6 6 1 6 2 6 3 2 4 5 1 3 6 5 4 2 2 2 4 1 2 5 3 1 1 5 4
 [75] 1 6 3 2 2 4 2 3 3 3 3 6 4 1 4 2 6 4 1 4 1 6 1 3 5 6
  1. Ejercicio rápido: ¿cómo podemos saber cuantas veces ha salido el numero 2?

Resolvemos

  1. Ejercicio rápido: ¿cómo podemos saber cuantas veces ha salido el numero 2?
sum (tiro == 2)
[1] 16

Ejercicio bucle

Genera un objeto que contenga 100 medias de 50 valores aleatorios generados a partir de una distribucion normal

Ejercicio bucle

Genera un objeto que contenga 100 medias de 50 valores aleatorios generados a partir de una distribucion normal

# Crear un vector vacío

filas <- c()

for (i in 1:100) {
  filas[[i]] <- mean (rnorm (50))
}

unlist(filas)
  [1]  0.023510533 -0.305012475  0.187617644 -0.170462869 -0.233562643
  [6]  0.091062651 -0.258393063  0.159675503 -0.023830425 -0.268473484
 [11] -0.132619971  0.017081188 -0.050727095 -0.057189032 -0.042869576
 [16] -0.138547589 -0.009732988 -0.150524790 -0.108701453 -0.097025553
 [21]  0.202393943  0.048307102 -0.196110123 -0.042714423  0.008417173
 [26]  0.166489088  0.085964840 -0.114553726  0.005893059  0.135317896
 [31] -0.156965563  0.001833673  0.276119322  0.029916000 -0.020476304
 [36] -0.221841955  0.046477283 -0.030652042  0.108785966 -0.153636702
 [41]  0.020041261  0.149205813  0.095974780  0.079782986 -0.002046597
 [46]  0.238218035  0.139870573  0.024109548 -0.171574998  0.077908532
 [51] -0.126629201 -0.096268009 -0.023923640 -0.057574723  0.217946126
 [56] -0.061385226  0.054080477  0.159742864  0.438215676  0.210895838
 [61]  0.282316999  0.133820362 -0.055539003  0.023115839 -0.078658703
 [66] -0.073520225 -0.039775438 -0.029596997 -0.148257039 -0.110465501
 [71] -0.013820640 -0.202895698 -0.156164949 -0.155881536  0.009855919
 [76] -0.071189440 -0.042765477  0.320753651  0.131203674  0.052538208
 [81]  0.177126154  0.051479627 -0.160232171  0.044491757 -0.162502267
 [86]  0.122891396 -0.075319245 -0.060045367  0.014781458 -0.182457847
 [91]  0.100959729  0.034897400  0.116786545  0.051289684 -0.095242198
 [96]  0.141047079 -0.015847392  0.003211326  0.026353126 -0.007934982

Bucles III

Guardamos en un objeto las iteraciones

# Creamos un dataframe vacío
tabla <- data.frame(numero = numeric(),
                    cuadrado = numeric())
tabla
[1] numero   cuadrado
<0 rows> (or 0-length row.names)
# Creamos un bucle que vaya llenando las filas y columnas con cada i
for (i in 1:5) {
  nueva_fila <- data.frame(numero = i, cuadrado = i^2)
  tabla <- rbind(tabla, nueva_fila)
}

tabla
  numero cuadrado
1      1        1
2      2        4
3      3        9
4      4       16
5      5       25

Bucles con ‘apply’, ‘sapply’, ‘lapply’

Otra forma de hacer bucles, pero en la misma linea

sapply(vectores, function(i) mean(log(i + 1)))

Condicionantes con ‘ifelse’

  • if (): R ejecuta el código dentro del bloque {} solo si la condición es verdadera.
  • if else (): si no se cumple la condición, haz esto otro
  • ifelse (): en una linea
x <- 10

if (x > 5) {
  print("El número es mayor que 5")
}
[1] "El número es mayor que 5"
x <- 3

if (x > 5) {
  print("El número es mayor que 5")
} else {
  print("El número es menor o igual que 5")
}
[1] "El número es menor o igual que 5"
edades <- c(15, 22, 35, 12)
ifelse (edades >= 18, "Adulto", "Menor")
[1] "Menor"  "Adulto" "Adulto" "Menor" 

Ejercicios

  • Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal

  • Opcional (y difícil). Haz una función que diga si un número cualquiera es par o no

Resolvemos

  • Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal

  • Haz una función que diga si un número cualquiera es par o no

temperaturas <- rpois (10, 15)
clasificacion <- ifelse(temperaturas < 15, "frio", "caliente")
data.frame (temperaturas, clasificacion)
   temperaturas clasificacion
1            19      caliente
2            13          frio
3            17      caliente
4            14          frio
5            21      caliente
6            19      caliente
7            13          frio
8            12          frio
9            19      caliente
10           15      caliente
que_tipo_de_numero_soy <- function (x) {
ifelse(x %% 2 == 0, "par", "impar")
}

que_tipo_de_numero_soy(2)
[1] "par"
que_tipo_de_numero_soy(33)
[1] "impar"

Bases de datos

Una base de datos (data frame) es una tabla de datos, como una hoja de cálculo en excel, tiene filas (observaciones) y columnas (variables).

# Creamos vectores con información
nombres <-  c ("Laura", "Rocio", "Violeta")
edad <- c(23, 35, 29)
altura <- c(1.65, 1.80, 1.70)
profesion <- c("Bióloga", "Informática", "Médica")

# Combinamos todo en un data frame
personas <- data.frame(
  NAME = nombres,
  AGE = edad,
  HEIGHT = altura,
  JOB = profesion)

personas
     NAME AGE HEIGHT         JOB
1   Laura  23   1.65     Bióloga
2   Rocio  35   1.80 Informática
3 Violeta  29   1.70      Médica

Seleccionar con R base

Seleccionamos filas, columnas sobre la base de datos

objeto[filas,columnas]

personas[1,] # FILAS
   NAME AGE HEIGHT     JOB
1 Laura  23   1.65 Bióloga
personas[,1] # COLUMNAS
[1] "Laura"   "Rocio"   "Violeta"
personas$NAME # Seleccionar columnas directamente con $
[1] "Laura"   "Rocio"   "Violeta"
# head(personas)       
# str(personas)  
# summary(personas) 
# colnames(personas) 
# nrow(personas)  
# ncol(personas)
# View(personas) se abre en RStudio como una tabla interactiva.
# write_csv(personas, "data/personas.csv")

tabla vista en R (View)

Leer bases de datos

Organiza correctamente tus carpetas 🙏 cómo organizar tus carpetas🙏

En la práctica, los datos vienen en archivos externos: CSV, Excel, TXT, u online.
El formato .csv (comma separated values) es el más común. Cada columna está separada por una coma o punto y coma.

Leer bases de datos

here () nos lleva a donde tengamos el archivo del script guardado

library(here)

# dir()
# getwd ()
# setwd ()

# CSV
datos_csv <- read.csv(here("data/personas.csv"))
head(datos_csv)
     NAME AGE HEIGHT       JOB
1   Laura  23   1.65   Bióloga
2   Rocio  35   1.80 Profesora
3 Violeta  29   1.70    Médica
# EXCEL
library(readxl)
datos_excel <- read_excel(here("data/herbarium_df.xlsx")) #, sheet = 1 podríamos especificar el numero de hoja

# GOOGLE SHEETS
library(googlesheets4)
datos_gs <- read_sheet("https://docs.google.com/spreadsheets/d/1qC4lsXPpEcX1NmLdwiMJMC8X_WKX-EFQm4ahPdrNCZc/edit?usp=sharing")

Guardar bases de datos

write.xlsx (datos_gs, "data/datos_gs.xlsx")
write_csv (datos_gs, "data/datos_gs.csv")
fwrite (datos_gs, "data/datos_gs.csv")

Ejercicio

Base de datos de flores: Por cada sitio y trampa, tenemos el numero de flores que tienen las especies de plantas en Doñana.

Ejercicio: Importa la base de datos “flores.csv” de la carpeta “data”, explora la base de datos, calcula la abundancia media de flores total, indica cuantas especies distintas hay de plantas. Luego, crea una base de datos con el número de individuos por especie (no de flores). Guardala como csv.

Resolvemos

flores <- read.csv(here("data/flores.csv"))
str(flores) # exploramos
'data.frame':   490 obs. of  5 variables:
 $ code     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ site_id  : chr  "ANZ_1" "ANZ_1" "ANZ_1" "ANZ_1" ...
 $ pantrap  : int  1 1 1 2 2 2 2 3 3 4 ...
 $ species  : chr  "Oxalis pes-caprae" "Cistus salvifolius" "Ornithogalum umbellatum" "Cistus salvifolius" ...
 $ abundance: int  3 16 4 2 3 4 1 3 1 8 ...
mean(flores$abundance) # media
[1] 16.45102
length(unique(flores$species)) # cuantas especies hay
[1] 74
# table(flores$species) # cuantas flores por especie
flores_sum <- data.frame(table(flores$species)) # número de individuos por especie
# write_csv (flores_sum, "data/flores_sum.csv")

Buenas prácticas de sintaxis en R

Espacios y asignaciones

  • Usa espacios alrededor de los operadores, usa <- en vez de =
  • Funciones con el mismo nombre, especifica el paquete (dplyr::select ())
  • Empieza tu script con una descripción sobre lo que hace el código, autorx, fecha y sesión.

Registro y reproducibilidad

  • Realiza todas las manipulaciones de datos mediante código, no manualmente
  • Así dejas rastro reproducible de cada cambio
  • Guarda o exporta tus datos en formatos de texto plano (.csv, .txt)

🙏 cómo organizar tus carpetas🙏

Código limpio

  • Comentarios útiles
  • Divide en pasos lógicos
  • Usa bien la sangría y los espacios
  • Usa bien los nombres
  • Guarda solo objetos útiles (R se va llenando)
  • Guarda una carpeta con los datos brutos

Tips

  • control + shift + C (des)comenta todo a la vez ##
  • control + shift + A reformatea el código
  • control + click se abre la tabla en RStudio

Compartir código

  • git. Es una herramienta de control de versiones que además permite trabajar en equipo
  • GitHub (portfolio de programador) Perfil

Escribir textos, informes, artículos

  • Quarto
  • Rmarkdown
  • Ciencia reproducible y limpia

Bibliografía

cookbook